3
תגובות

שאלה בSQL Injection

פתח משתמש_96152 ,
איך אפשר לאבטח מפני SQL Injection בPDO כשהקוד הוא:

$p = array(
                "name"  => mysql_real_escape_string(htmlspecialchars($_POST["prmt_name"])) ,
                "mida"  => mysql_real_escape_string(htmlspecialchars($_POST["prmt_mida"])) ,
                "after" => mysql_real_escape_string(htmlspecialchars($_POST["aftr"])) ,
                "type"  => mysql_real_escape_string(htmlspecialchars($_POST["typ"])),
                "tip"   => mysql_real_escape_string(htmlspecialchars($_POST["prmt_tip"])),
                "group"   => mysql_real_escape_string(htmlspecialchars($_POST["grp"])) );
               
            if ($p["after"] == "end"){
                $q = "ALTER TABLE  `nbp` ADD `". $p["name"] ."` ". $p["type"] ."( 64 ) CHARACTER SET hebrew COLLATE hebrew_general_ci NULL";
                if ($result = $this->pdo->query($q))
                    echo "ok:";

3 תשובות

avatar ענה intval ב 29 לינואר 2012 #

אני ממליץ לך לעבור על הדוגמאות של PDO בדוקומנטציה ולראות איך הם עושים את זה שם.
במקרה שלך התוצאה תהיה:

$statement = $pdo->prepare("ALTER TABLE  `nbp` ADD :column :type CHARACTER SET hebrew COLLATE hebrew_general_ci NULL");
      $statement->execute(array('column' => 'somename1', 'type' => 'varchar(64)'));


חוץ מזה שלא בטוח שהשאילתה תעבוד בצורה הזו, אתה עושה משהו ממש ממש ממש לא נכון.
1. אין שום סיבה שהיא שיתווספו עמודות לטבלה אחרי הפעלת המערכת. תחשוב שוב על מבנה התוכנה
2. ממליץ לך לעבוד עם קידוד utf-8 ולא עם שום דבר אחר.
3. בטח שלא לקבל שמות לעמודות וסוגים מהמשתמש. תעשה switch אם אתה רוצה (אבל אתה לא רוצה, כי בטוח משהו במבנה שחשבת עליו לא בסדר בכלל)

avatar ענה iiddaannyy ב 29 לינואר 2012 #

*אל תמיר את המרוזת עם htmlspecialchars לפני ההכנסה למסד. את זה עושים אחרי השליפה.

avatar ענה yehudade ב 29 לינואר 2012 #

אני לא אכנס אפילו לנושא של מסד הנתונים, אלכס ענה על זה בצורה ברורה.
בקוד מבוסס קלט גולשים, השלב הראשון בקלט הוא להעביר את הקלט בדיקות פשטות ולבדוק מול ביטויים רגולריים ורק אחר כך לתת לשאר הקוד לעבוד עם המידע.
מעבר לבעיות שזה יפתור לך בצד האבטחתי, מבנה ברור של הקוד, עם תפקידים ברורים של מקטעי הקוד יאפשרו לך לתחזק את הקוד בקלות יתר.